
package model;

import controle.GerenciadorArquivos;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

/**
 *	Classe que implementa modelo de persistência
 * para a entidade Fornecedor.
 * 
 * @author Marcos Vinicius Rogowski
 */

public class FornecedorDAO implements OperacoesDAO{
	private HashMap<String, Fornecedor> fornecedores = new HashMap();
    private static FornecedorDAO instancia = null;
    
	/**
	 * Contrutores da classe.
	 * 
	 */
	
    public static FornecedorDAO newInstance(){
        if (instancia == null){
            instancia = new FornecedorDAO();
        }
        return instancia;
    }

    private FornecedorDAO() {
        if (fornecedores.isEmpty()) {
            Object obj = GerenciadorArquivos.lerDados("fornecedores.dat");
            if (obj instanceof HashMap) {
                fornecedores = (HashMap) obj;
            }
        }
    }

    /**
	 * Insere um fornecedor no mapa.
	 * 
	 * @param obj Objeto a ser inserido
	 */
    @Override
    public void inserir(Object obj) {
        if (obj instanceof Fornecedor) {
            Fornecedor func = (Fornecedor) obj;
            String chave = func.getCnpj();
            fornecedores.put(chave, func);
        }
    }

    /**
	 * Exclui um objeto do mapa.
	 * 
	 * @param obj Chave para localização do objeto no mapa.
	 * @return boolean
	 */
    @Override
    public boolean excluir(Object obj) {
        if (obj instanceof String) {
            String chave = (String) obj;
            Fornecedor forn = fornecedores.remove(chave);
            if (forn != null) {
                return true;
            }
        }
        return false;
    }

	/**
	 * Edita um objeto já inserido no mapa.
	 * 
	 * @param obj Objeto a ser editado
	 */
    @Override
    public void editar(Object obj) {
        if (obj instanceof Fornecedor) {
            Fornecedor novo = (Fornecedor) obj; // Com os dados a serem alterados
            String chave = novo.getCnpj();
            fornecedores.put(chave, novo);
        }
    }

    /**
	 * Efetua uma pesquisa no mapa
	 * 
	 * @return Todos os objetos registrados.
	 */
    @Override
    public ArrayList pequisar() {
        Collection<Fornecedor> lista = fornecedores.values();
        ArrayList retorno = new ArrayList(lista);
        return retorno;
    }

	/**
	 * Retorna um objeto identificado por uma chave.
	 * 
	 * @param chave Chave para seleção do Objeto.
	 * @return 
	 */
    public Fornecedor pesquisar(String chave) {
        Fornecedor forn = fornecedores.get(chave);
        return forn;
        // Se não encontrar a chave retorna null;
    }

	
	/**
	 * Grava as alterações em arquivo.
	 * 
	 */
    public void finalizar(){
        GerenciadorArquivos.gravarDados("fornecedores.dat", fornecedores);
    }
}
